home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / optimize.s < prev    next >
Text File  |  1999-03-02  |  40KB  |  1,564 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        パス2(前方参照の最適化)
  4. ;        < optimize.s >
  5. ;
  6. ;    $Id: optimize.s,v 2.5  1999  3/ 2(Tue) 17:04:08 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;                  1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    symbol.equ
  14.     .include    register.equ
  15.     .include    tmpcode.equ
  16.     .include    cputype.equ
  17.     .include    eamode.equ
  18.     .include    error2.equ
  19.  
  20.     .cpu    68000
  21.     .text
  22.  
  23.  
  24. ;----------------------------------------------------------------
  25. ;    パス2(前方参照の最適化)
  26. ;----------------------------------------------------------------
  27. asmpass2::
  28.     move.b    #2,(ASMPASS,a6)
  29.     tst.b    (OPTIMIZE,a6)
  30.     bne    asmpass29        ;/nの指定があったので何もしない
  31.  
  32.     clr.b    (OPTCOUNT,a6)
  33.     move.b    #SZ_LONG|ESZ_OPT,(OPTMOREFLG,a6)
  34. asmpass21:
  35.     move.l    (CPUSYMBOL,a6),d0
  36.     beq    asmpass219
  37.     movea.l    d0,a1
  38.     move.l    (STARTCPU,a6),(SYM_VALUE,a1)
  39. asmpass219:
  40.     addq.b    #1,(OPTCOUNT,a6)
  41.     sf.b    (OPTFLAG,a6)
  42.     lea.l    (TEMPFILPTR,a6),a1
  43.     bsr    frewind            ;テンポラリファイル先頭に移動
  44.     bsr    resetlocctr        ;ロケーションカウンタの初期化
  45.  
  46.     suba.l    a5,a5            ;(LOCATION,a6)
  47.     suba.l    a4,a4            ;(LOCOFFSET,a6)
  48.     bsr    dopass2            ;最適化を実行する
  49.     move.l    a5,(LOCATION,a6)
  50.     move.l    a4,(LOCOFFSET,a6)
  51.     moveq.l    #SECT_TEXT,d0
  52.     bsr    chgsection        ;textセクションに戻す
  53.     move.b    #SZ_LONG,(OPTMOREFLG,a6)
  54.     tst.b    (OPTFLAG,a6)
  55.     bne    asmpass21
  56. asmpass29:
  57.     rts
  58.  
  59. ;----------------------------------------------------------------
  60. dopass2:
  61.     bsr    tmpreadd0w
  62.     move.w    d0,d1
  63.     beq    dopass29        ;テンポラリファイル終了
  64. dopass21:
  65.     clr.b    d1
  66.     sub.w    d1,d0
  67.     ror.w    #6,d1
  68.     jsr    (pass2_tbl-4,pc,d1.w)
  69.     bsr    tmpreadd0w
  70.     move.w    d0,d1
  71.     bne    dopass21
  72. dopass29:
  73.     rts
  74.  
  75. ;----------------------------------------------------------------
  76. ;    テンポラリファイルコード処理アドレス
  77. pass2_tbl:
  78.     bra.w    linetop        ;01    1行開始
  79.     bra.w    symdata        ;02    シンボル値
  80.     bra.w    rpndata        ;03    逆ポーランド式
  81.  
  82.     bra.w    dispadr        ;04    (d,An)
  83.     bra.w    disppc        ;05    (d,PC)
  84.     bra.w    indexadr    ;06    (d,An,Rn)
  85.     bra.w    indexpc        ;07    (d,PC,Rn)
  86.     bra.w    extcode        ;08    拡張ワード
  87.     bra.w    bdadr        ;09    アドレスレジスタ間接ベースディスプレースメント
  88.     bra.w    bdpc        ;0A    PC間接ベースディスプレースメント
  89.     bra.w    odisp        ;0B    アウタディスプレースメント
  90.  
  91.     bra.w    bracmd        ;0C    bra/bsr/b<cc>.s/.w/.l
  92.     bra.w    cpbracmd    ;0D    cpb<cc>.w/.l
  93.     bra.w    dspcode        ;0E    (d,An)/(d,PC)の命令コード
  94.     bra.w    coderpn        ;0F    命令コード埋め込み式データ
  95.     bra.w    constdata    ;10    アドレス非依存データ
  96.     bra.w    bitfield    ;11    ビットフィールド式データ
  97.     bra.w    dscmd        ;12    .ds
  98.     bra.w    dcbcmd        ;13    .dcb
  99.     bra.w    aligncmd    ;14    アラインメントの調整
  100.     bra.w    sectchg        ;15    セクション変更
  101.     bra.w    ofstcmd        ;16    .offset
  102.     bra.w    equconst    ;17    定数の.equ/.set
  103.     bra.w    equexpr        ;18    式・アドレスの.equ/.set
  104.     bra.w    xdefcmd        ;19    .xdef
  105.     bra.w    prnctrl        ;1A    リスト出力制御
  106.     bra.w    pagecmd        ;1B    .page
  107.     bra.w    subttlcmd    ;1C    .subttl
  108.     bra.w    orgcmd        ;1D    .org
  109.     bra.w    endcmd        ;1E    .end
  110.     bra.w    incldopen    ;1F    includeファイル開始
  111.     bra.w    incldend    ;20    includeファイル終了
  112.     bra.w    macdef        ;21    マクロ定義開始
  113.     bra.w    macext        ;22    マクロ展開開始
  114.     bra.w    exitmcmd    ;23    .exitm
  115.     bra.w    reptcmd        ;24    .rept展開開始
  116.     bra.w    irpcmd        ;25    .irp/.irpc展開開始
  117.     bra.w    mdefbgn        ;26    マクロ等定義開始
  118.     bra.w    mdefend        ;27    マクロ等定義終了
  119.     bra.w    lncmd        ;28    .ln
  120.     bra.w    valcmd        ;29    .val
  121.     bra.w    tagcmd        ;2A    .tag
  122.     bra.w    scdshort    ;2B    .endef(短形式)
  123.     bra.w    scdlong        ;2C    .endef(長形式)
  124.     bra.w    funcend        ;2D    .scl -1(関数定義終了)
  125.  
  126.     bra.w    fequset        ;2E    .fequ/.fset
  127.     bra.w    symdef        ;2F    シンボル定義
  128.     bra.w    fdcbcmd        ;30    .dcb(浮動小数点実数)
  129.     bra.w    jbracmd        ;31    jbra/jbsr/jb<cc>
  130.     bra.w    dispopc        ;32    (d,OPC)
  131.     bra.w    linkcmd        ;33    link.w/.l
  132.  
  133.     bra.w    nopdeath    ;34    削除すべきNOP
  134.     bra.w    nopalive    ;35    挿入されたNOP
  135.  
  136.     bra.w    prnadv        ;36    PRNファイルへの先行出力
  137.  
  138.     bra.w    offsymcmd    ;37    .offsym
  139.  
  140.     bra.w    error        ;38    エラー発生
  141.  
  142. ;----------------------------------------------------------------
  143. nopdeath:                ;34xx 削除すべきNOP
  144.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  145.     bsr    tmpreadd0w        ;NOP
  146.     cmp.w    #$4E71,d0
  147.     beq    nopdeath_nul
  148.     rts
  149.  
  150. nopdeath_nul:
  151. ;NOPは消滅するのでロケーションカウンタを増やさなくてよい
  152.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  153.     addq.l    #2,a4            ;最適化によって減ったバイト数
  154.     clr.w    d0
  155.     move.l    d3,d1
  156.     bra    fmodify
  157.  
  158. nopalive:
  159.     bra    constdata
  160.  
  161. ;----------------------------------------------------------------
  162. prnctrl:                ;1Axx リスト出力制御
  163. pagecmd:                ;1Bxx .page
  164. incldend:                ;20xx includeファイル終了
  165. exitmcmd:                ;23xx .exitm
  166. mdefbgn:                ;26xx マクロ等定義開始
  167. mdefend:                ;27xx マクロ等定義終了
  168. funcend:                ;2Dxx .scl -1(関数定義終了)
  169. prnadv:                    ;36xx PRNファイルへの先行出力
  170.     rts                ;何もしない
  171.  
  172. ;----------------------------------------------------------------
  173. detequ:                    ;17xx 値の確定している.equ
  174. xdefcmd:                ;19xx .xdef
  175. subttlcmd:                ;1Cxx .subttl
  176. incldopen:                ;1Fxx includeファイル開始
  177. tagcmd:                    ;2Axx .tag
  178. error:                    ;38xx エラー発生
  179.     moveq.l    #2*2,d0
  180.     bra    tempskip        ;2ワード読み飛ばす
  181.  
  182. ;----------------------------------------------------------------
  183. macext:                    ;22xx マクロ展開開始
  184. reptcmd:                ;24xx .rept展開開始
  185.     moveq.l    #3*2,d0
  186.     bra    tempskip        ;3ワード読み飛ばす
  187.  
  188. ;----------------------------------------------------------------
  189. macdef:                    ;21xx マクロ定義開始
  190.     moveq.l    #4*2,d0
  191.     bra    tempskip        ;4ワード読み飛ばす
  192.  
  193. ;----------------------------------------------------------------
  194. irpcmd:                    ;25xx .irp/.irpc展開開始
  195.     moveq.l    #5*2,d0
  196.     bra    tempskip        ;5ワード読み飛ばす
  197.  
  198. ;----------------------------------------------------------------
  199. scdshort:                ;2Bxx .endef(短形式)
  200.     moveq.l    #6*2,d0
  201.     bra    tempskip        ;6ワード読み飛ばす
  202.  
  203. ;----------------------------------------------------------------
  204. fequset:                ;2Exx .fequ/.fset
  205.     moveq.l    #8*2,d0
  206.     bra    tempskip        ;8ワード読み飛ばす
  207.  
  208. ;----------------------------------------------------------------
  209. scdlong:                ;2Cxx .endef(長形式)
  210.     moveq.l    #12*2,d0
  211.     bra    tempskip        ;12ワード読み飛ばす
  212.  
  213. ;----------------------------------------------------------------
  214. linetop:                ;01xx 行開始コード
  215.     move.l    a5,(LTOPLOC,a6)
  216.     rts
  217.  
  218. ;----------------------------------------------------------------
  219. symdata:                ;02xx シンボル値
  220.     bsr    getdtsize
  221.     add.l    d0,a5
  222.     moveq.l    #2*2,d0
  223.     bra    tempskip
  224.  
  225. ;----------------------------------------------------------------
  226. rpndata:                ;03xx 逆ポーランド式
  227.     bsr    getdtsize
  228.     add.l    d0,a5
  229. rpndata1:
  230.     bsr    tmpreadd0w
  231.     addq.w    #1,d0
  232.     add.w    d0,d0
  233.     bra    tempskip        ;式を読み飛ばす
  234.  
  235. ;----------------------------------------------------------------
  236. lncmd:                    ;28xx .ln
  237.     moveq.l    #1*2,d0
  238.     bsr    tempskip        ;命令コードを読み飛ばす
  239. ;    bra    skipexpr
  240.  
  241. ;----------------------------------------------------------------
  242. endcmd:                    ;1Exx .end
  243. valcmd:                    ;29xx .val
  244. skipexpr:                ;後続のシンボル値/式を読み飛ばす
  245.     bsr    tmpreadd0w
  246. skipexpr1:
  247.     and.w    #$FF00,d0
  248.     cmp.w    #T_SYMBOL,d0
  249.     bne    rpndata1        ;式が続く場合
  250.     moveq.l    #2*2,d0            ;シンボル値が続く場合
  251.     bra    tempskip
  252.  
  253. ;----------------------------------------------------------------
  254. constdata:                ;10xx アドレス非依存データ
  255.     addq.w    #1,d0
  256.     ext.l    d0
  257.     add.l    d0,a5
  258.     addq.w    #1,d0
  259.     bclr.l    #0,d0
  260.     bra    tempskip        ;あとに続くデータを読み飛ばす
  261.  
  262. ;----------------------------------------------------------------
  263. bitfield:                ;11xx ビットフィールド式データ
  264.     move.w    d0,d1
  265.     addq.l    #2,a5
  266.     moveq.l    #1*2,d0
  267.     bsr    tempskip        ;命令コードを読み飛ばす
  268.     cmp.b    #TBF_OFWD,d1
  269.     bne    skipexpr        ;後続の式が1つの場合
  270.     bsr    skipexpr
  271.     bra    skipexpr
  272.  
  273. ;----------------------------------------------------------------
  274. dscmd:                    ;12xx .ds
  275.     bsr    tmpreadd0l        ;長さを読み出す
  276.     add.l    d0,a5
  277.     rts
  278.  
  279. ;----------------------------------------------------------------
  280. dcbcmd:                    ;13xx .dcb
  281.     bsr    tmpreadd0w        ;長さを読み出す
  282.     move.w    d0,d1
  283.     bsr    tmpreadd0w
  284.     move.w    d0,d2
  285.     bsr    getdtsize
  286.     addq.w    #1,d1
  287.     mulu.w    d0,d1            ;生成するデータのサイズ
  288.     add.l    d1,a5
  289.     move.w    d2,d0
  290.     bra    skipexpr1
  291.  
  292. ;----------------------------------------------------------------
  293. fdcbcmd:                ;30xx .dcb(浮動小数点実数)
  294.     move.w    d0,d1            ;データ長
  295.     bsr    tmpreadd0w        ;長さを読み出す
  296.     ext.l    d0
  297.     addq.l    #1,d0
  298.     add.l    d0,d0
  299.     add.l    d0,d0
  300.     moveq.l    #0,d2
  301. fdcbcmd1:
  302.     add.l    d0,d2
  303.     dbra    d1,fdcbcmd1
  304.     add.l    d2,a5
  305.     moveq.l    #6*2,d0
  306.     bra    tempskip        ;6ワード読み飛ばす
  307.  
  308. ;----------------------------------------------------------------
  309. symdef:                    ;2Fxx シンボル定義
  310.     bsr    tmpreadd0l        ;シンボルへのポインタ
  311.     move.l    d0,a0
  312.     move.l    (LTOPLOC,a6),(SYM_VALUE,a0)
  313.     move.b    (OPTCOUNT,a6),(SYM_OPTCOUNT,a0)
  314.     rts
  315.  
  316. ;----------------------------------------------------------------
  317. equconst:                ;17xx 定数の.equ/.set
  318.     bsr    tmpreadd0l        ;シンボルへのポインタ
  319.     move.l    d0,a0
  320.     bsr    tmpreadd0l        ;シンボル値
  321.     move.l    d0,(SYM_VALUE,a0)
  322.     clr.w    (SYM_SECTION,a0)    ;(SYM_ORGNUM)
  323.     move.b    #SA_DEFINE,(SYM_ATTRIB,a0)
  324.     rts
  325.  
  326. ;----------------------------------------------------------------
  327. equexpr:                ;18xx 式・アドレスの.equ/.set
  328.     bsr    tmpreadd0l        ;シンボルへのポインタ
  329.     move.l    d0,a0
  330.     bsr    tmpreadd0w
  331.     bsr    calctmpexpr        ;後続の式の値を得る
  332.     cmp.w    #$00FF,d0
  333.     bcc    equexpr9        ;シンボル値が確定しない
  334.     move.b    d0,(SYM_SECTION,a0)
  335.     move.l    d1,(SYM_VALUE,a0)
  336.     move.b    #SA_DEFINE,(SYM_ATTRIB,a0)
  337.     move.b    (OPTCOUNT,a6),(SYM_OPTCOUNT,a0)
  338. equexpr9:
  339.     rts
  340.  
  341. ;----------------------------------------------------------------
  342. aligncmd:                ;14xx アラインメントの調整
  343.     moveq.l    #1,d1
  344.     lsl.l    d0,d1
  345.     subq.l    #1,d1            ;d1=2^d0 - 1
  346.     move.l    a5,d2
  347.     move.l    d2,d3
  348.     add.l    d1,d2
  349.     not.l    d1
  350.     and.l    d1,d2
  351.     movea.l    d2,a5
  352.     sub.l    d3,d2
  353.     bsr    tmpreadd0w        ;パディングワードは読み飛ばす
  354.     GETFPTR    TEMPFILPTR,d1        ;現在のファイルポインタ位置を得る
  355.     bsr    tmpreadd0w        ;前回のパディング長を読み出す
  356.     sub.w    d2,d0            ;最適化によって減ったバイト数
  357.     adda.w    d0,a4
  358.     move.w    d2,d0
  359.     bra    fmodify            ;ロケーションカウンタ値を修正する
  360.  
  361. ;----------------------------------------------------------------
  362. sectchg:                ;15xx セクション変更
  363. ;offsymでシンボルなしのときも0になってしまうが
  364. ;パス2以降では二重定義エラーは出ないはずなので無視する
  365.     sf.b    (OFFSYMMOD,a6)
  366.     move.l    a5,(LOCATION,a6)
  367.     move.l    a4,(LOCOFFSET,a6)
  368.     bsr    chgsection
  369.     movea.l    (LOCATION,a6),a5
  370.     movea.l    (LOCOFFSET,a6),a4
  371.     rts
  372.  
  373. ;----------------------------------------------------------------
  374. offsymcmd:                ;37xx .offsym
  375.     move.l    a5,(LOCATION,a6)
  376.     move.l    a4,(LOCOFFSET,a6)
  377.     moveq.l    #0,d0
  378.     bsr    chgsection
  379.     bsr    tmpreadd0l        ;初期値を読み出す
  380.     move.l    d0,(OFFSYMVAL,a6)
  381.     bsr    tmpreadd0l        ;シンボルを読み出す
  382.     move.l    d0,(OFFSYMSYM,a6)
  383.     bsr    tmpreadd0l        ;仮シンボルを読み出す
  384.     move.l    d0,(OFFSYMTMP,a6)
  385.     move.b    #1,(OFFSYMMOD,a6)    ;offsymでシンボルあり
  386.     suba.l    a5,a5
  387.     suba.l    a4,a4
  388.     rts
  389.  
  390. ;----------------------------------------------------------------
  391. ofstcmd:                ;16xx .offset
  392.     move.l    a5,(LOCATION,a6)
  393.     move.l    a4,(LOCOFFSET,a6)
  394.     moveq.l    #0,d0
  395.     bsr    chgsection
  396.     bsr    tmpreadd0l        ;オフセット値を読み出す
  397.     move.l    d0,a5
  398.     suba.l    a4,a4
  399.     rts
  400.  
  401. ;----------------------------------------------------------------
  402. orgcmd:                    ;1Dxx .org
  403.     bsr    tmpreadd0l        ;ロケーションカウンタ値を読み出す
  404.     move.l    d0,a5
  405.     suba.l    a4,a4
  406.     addq.b    #1,(ORGNUM,a6)
  407.     rts
  408.  
  409. ;----------------------------------------------------------------
  410. extcode:                ;08xx 拡張ワード
  411.     addq.l    #2,a5
  412.     GETFPTR    TEMPFILPTR,d0        ;現在のファイルポインタ位置を得る
  413.     move.l    d0,(OPTEXTPOS,a6)
  414.     bsr    tmpreadd0w        ;拡張ワードを読み出す
  415.     move.w    d0,(OPTEXTCODE,a6)
  416.     rts
  417.  
  418. ;----------------------------------------------------------------
  419. dspcode:                ;0Exx (d,An)/(d,PC)の命令コード
  420.     addq.l    #2,a5
  421.     GETFPTR    TEMPFILPTR,d0        ;現在のファイルポインタ位置を得る
  422.     move.l    d0,(OPTDSPPOS,a6)
  423.     bsr    tmpreadd0w        ;命令コードを読み出す
  424.     move.w    d0,(OPTDSPCODE,a6)
  425.     rts
  426.  
  427. ;----------------------------------------------------------------
  428. coderpn:                ;0Fxx 命令コード埋め込み式データ
  429.     addq.l    #2,a5
  430.     GETFPTR    TEMPFILPTR,d0        ;現在のファイルポインタ位置を得る
  431.     move.l    d0,(OPTDSPPOS,a6)
  432.     bsr    tmpreadd0w        ;命令コードを読み出す
  433.     move.w    d0,(OPTDSPCODE,a6)
  434.     bra    skipexpr
  435.  
  436. ;----------------------------------------------------------------
  437. dispadr:                ;04xx (d,An)
  438.     move.b    d0,d5            ;(moveデスティネーションならtrue)
  439.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  440.     bsr    tmpreadd0w
  441.     move.w    d0,d2
  442.     tst.b    d0
  443.     bmi    dispadr5        ;最適化対象コードの場合
  444.     beq    skipexpr1        ;(ディスプレースメントはサプレスされている)
  445.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  446. dispadr1:
  447.     cmpi.b    #SZ_WORD,d2
  448.     bne    dispadr2
  449.     addq.l    #2,a5            ;ディスプレースメントサイズが.wの場合
  450.     rts
  451.  
  452. dispadr2:
  453.     addq.l    #6,a5            ;                 .lの場合
  454. dispadr9:
  455.     rts
  456.  
  457. dispadr8:                ;最適化できない場合
  458.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  459.     move.w    d2,d0
  460.     move.l    d3,d1
  461.     bsr    fmodify
  462.     bra    dispadr1
  463.  
  464. dispadr5:                ;最適化対象コード
  465.     bsr    calctmpexpr        ;後続の式の値を計算する
  466.     tst.b    d0
  467.     beq    dispadr6
  468.     cmp.b    #SECT_RDATA,d0
  469.     bcc    dispadr8        ;定数でない場合は最適化できない
  470.     bra    dispadr5_l
  471.  
  472. dispadr6:
  473.     move.l    d1,d0            ;(tst.l d1 & move.w d1,d0)
  474.     beq    dispadr5_nul
  475.     bra68    d4,dispadr5_w        ;68000/68010なら0でなければ.w
  476.     tst.b    (CPUTYPE2,a6)
  477.     bne    dispadr5_w
  478.     ext.l    d0
  479.     cmp.l    d0,d1
  480.     beq    dispadr5_w
  481. dispadr5_l:
  482.     addq.l    #6,a5
  483.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  484.     beq    dispadr9        ;最適化前のサイズと同じなので何もしない
  485.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  486.     subq.l    #4,a4            ;(.w→.lのみ)
  487.     move.w    d2,d0
  488.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  489.     move.l    d3,d1
  490.     bsr    fmodify
  491.     move.w    (OPTDSPCODE,a6),d0    ;(d,An)→(bd,An)の変更を行う
  492.     move.l    (OPTDSPPOS,a6),d1
  493.     tst.b    d5
  494.     bne    dispadr5_l1
  495.     and.w    #.not.$0038,d0
  496.     or.w    #EAC_BDADR,d0
  497.     move.w    d0,(OPTDSPCODE,a6)
  498.     bra    fmodify
  499.  
  500. dispadr5_l1:                ;moveのデスティネーション実効アドレス
  501.     and.w    #.not.$01C0,d0
  502.     or.w    #EAC_BDADR<<3,d0
  503.     bra    fmodify
  504.  
  505. dispadr5_w:
  506.     addq.l    #2,a5
  507.     moveq.l    #SZ_WORD|ESZ_OPT,d0
  508.     cmp.b    d0,d2
  509.     beq    dispadr9        ;最適化前のサイズと同じなので何もしない
  510.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  511.     addq.l    #4,a4            ;(.l→.wのみ)
  512.     move.b    d0,d2            ;(後で伸びる場合がある)
  513.     move.w    d2,d0
  514.     move.l    d3,d1
  515.     bsr    fmodify
  516.     move.w    (OPTDSPCODE,a6),d0    ;(bd,An)→(d,An)の変更を行う
  517.     move.l    (OPTDSPPOS,a6),d1
  518.     tst.b    d5
  519.     bne    dispadr5_w1
  520.     and.w    #.not.$0038,d0
  521.     or.w    #EAC_DSPADR,d0
  522.     move.w    d0,(OPTDSPCODE,a6)
  523.     bra    fmodify
  524.  
  525. dispadr5_w1:                ;moveのデスティネーション実効アドレス
  526.     and.w    #.not.$01C0,d0
  527.     or.w    #EAC_DSPADR<<3,d0
  528.     bra    fmodify
  529.  
  530. dispadr5_nul:
  531.     tst.b    (NONULDISP,a6)
  532.     bne    dispadr5_w
  533.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  534.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  535.     beq    dispadr5_nul1
  536.     addq.l    #6,a4            ;.l→0の場合
  537.     bra    dispadr5_nul2
  538.  
  539. dispadr5_nul1:
  540.     addq.l    #2,a4            ;.w→0の場合
  541. dispadr5_nul2:
  542.     move.w    d2,d0
  543.     clr.b    d0            ;ディスプレースメントサプレス確定
  544.     move.l    d3,d1
  545.     bsr    fmodify
  546.     move.w    (OPTDSPCODE,a6),d0    ;(bd,An)/(d,An)→(An)の変更を行う
  547.     move.l    (OPTDSPPOS,a6),d1
  548.     tst.b    d5
  549.     bne    dispadr5_nul5
  550.     and.w    #.not.$0038,d0
  551.     or.w    #EAC_ADR,d0
  552.     move.w    d0,(OPTDSPCODE,a6)
  553.     bra    fmodify
  554.  
  555. dispadr5_nul5:                ;moveのデスティネーション実効アドレス
  556.     and.w    #.not.$01C0,d0
  557.     or.w    #EAC_ADR<<3,d0
  558.     bra    fmodify
  559.  
  560. ;----------------------------------------------------------------
  561. disppc:                    ;05xx (d,PC)
  562.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  563.     bsr    tmpreadd0w
  564.     move.w    d0,d2
  565.     tst.b    d0
  566.     bmi    disppc5            ;最適化対象コードの場合
  567.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  568. disppc1:
  569.     cmpi.b    #SZ_WORD,d2
  570.     bne    disppc2
  571.     addq.l    #2,a5            ;ディスプレースメントサイズが.wの場合
  572.     rts
  573.  
  574. disppc2:
  575.     addq.l    #6,a5            ;                 .lの場合
  576. disppc9:
  577.     rts
  578.  
  579. disppc8:                ;最適化できない場合
  580.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  581.     move.w    d2,d0
  582.     move.l    d3,d1
  583.     bsr    fmodify
  584.     bra    disppc1
  585.  
  586. disppc5:                ;最適化対象コード
  587.     bsr    calctmpexpr        ;後続の式の値を計算する
  588.     tst.b    d0
  589.     bmi    disppc8            ;値が未定なので最適化できない
  590.     bne    disppc6
  591.     move.w    d1,d0            ;定数の場合
  592.     ext.l    d0
  593.     cmp.l    d0,d1
  594.     beq    disppc5_w
  595.     bra    disppc5_l
  596.  
  597. disppc6:                ;アドレス値の場合
  598.     cmp.b    (SECTION,a6),d0
  599.     bne    disppc8            ;セクションが違うので最適化できない
  600.     sub.l    a5,d1            ;現在のアドレスからの相対値
  601.     move.w    d1,d0
  602.     ext.l    d0
  603.     cmp.l    d0,d1
  604.     beq    disppc5_w
  605.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  606.     beq    disppc5_l        ;$8000以上なら.w→.l
  607.     cmp.l    #$8004,d1
  608.     bcs    disppc5_w        ;$8004未満なら.l→.w
  609.     addq.l    #6,a5
  610.     rts
  611.  
  612. disppc5_l:
  613.     addq.l    #6,a5
  614.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  615.     beq    disppc9            ;最適化前のサイズと同じなので何もしない
  616.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  617.     subq.l    #4,a4            ;(.w→.lのみ)
  618.     move.w    d2,d0
  619.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  620.     move.l    d3,d1
  621.     bsr    fmodify
  622.     move.w    (OPTDSPCODE,a6),d0    ;(d,PC)→(bd,PC)の変更を行う
  623.     move.l    (OPTDSPPOS,a6),d1
  624.     and.w    #.not.$003F,d0
  625.     or.w    #EAC_BDPC,d0
  626.     bra    fmodify
  627.  
  628. disppc5_w:
  629.     addq.l    #2,a5
  630.     moveq.l    #SZ_WORD|ESZ_OPT,d0
  631.     cmp.b    d0,d2
  632.     beq    disppc9            ;最適化前のサイズと同じなので何もしない
  633.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  634.     addq.l    #4,a4            ;(.l→.wのみ)
  635.     move.b    d0,d2            ;(後で伸びる場合がある)
  636.     move.w    d2,d0
  637.     move.l    d3,d1
  638.     bsr    fmodify
  639.     move.w    (OPTDSPCODE,a6),d0    ;(bd,An)→(d,An)の変更を行う
  640.     move.l    (OPTDSPPOS,a6),d1
  641.     and.w    #.not.$003F,d0
  642.     or.w    #EAC_DSPPC,d0
  643.     bra    fmodify
  644.  
  645. ;----------------------------------------------------------------
  646. dispopc:                ;32xx (d,OPC)
  647.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  648.     bsr    tmpreadd0w
  649.     move.w    d0,d2
  650.     tst.b    d0
  651.     bmi    dispopc5        ;最適化対象コードの場合
  652.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  653. dispopc1:
  654.     cmpi.b    #SZ_WORD,d2
  655.     bne    dispopc2
  656.     addq.l    #2,a5            ;ディスプレースメントサイズが.wの場合
  657.     rts
  658.  
  659. dispopc2:
  660.     addq.l    #4,a5            ;-2                 .lの場合
  661. dispopc9:
  662.     rts
  663.  
  664. dispopc8:                ;最適化できない場合
  665.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  666.     move.w    d2,d0
  667.     move.l    d3,d1
  668.     bsr    fmodify
  669.     bra    dispopc1
  670.  
  671. dispopc5:                ;最適化対象コード
  672.     bsr    calctmpexpr        ;後続の式の値を計算する
  673.     tst.b    d0
  674.     bmi    dispopc8        ;値が未定なので最適化できない
  675.     bne    dispopc6
  676.     move.w    d1,d0            ;定数の場合
  677.     ext.l    d0
  678.     cmp.l    d0,d1
  679.     beq    dispopc5_w
  680.     bra    dispopc5_l
  681.  
  682. dispopc6:                ;アドレス値の場合
  683.     cmp.b    (SECTION,a6),d0
  684.     bne    dispopc8        ;セクションが違うので最適化できない
  685.     sub.l    a5,d1            ;現在のアドレスからの相対値
  686.     move.w    d1,d0
  687.     ext.l    d0
  688.     cmp.l    d0,d1
  689.     beq    dispopc5_w
  690.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  691.     beq    dispopc5_l        ;$8000以上なら.w→.l
  692.     cmp.l    #$8002,d1        ;-2
  693.     bcs    dispopc5_w        ;$8002未満なら.l→.w
  694.     addq.l    #4,a5            ;-2
  695.     rts
  696.  
  697. dispopc5_l:
  698.     addq.l    #4,a5            ;-2
  699.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  700.     beq    dispopc9        ;最適化前のサイズと同じなので何もしない
  701.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  702.     subq.l    #2,a4            ;-2(.w→.lのみ)
  703.     move.w    d2,d0
  704.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  705.     move.l    d3,d1
  706.     bsr    fmodify
  707.     move.w    (OPTDSPCODE,a6),d0    ;(d,PC)→xxxx.lの変更を行う
  708.     move.l    (OPTDSPPOS,a6),d1
  709.     and.w    #.not.$003F,d0
  710.     or.w    #EAC_ABSL,d0        ;-2
  711.     bra    fmodify
  712.  
  713. dispopc5_w:
  714.     addq.l    #2,a5
  715.     moveq.l    #SZ_WORD|ESZ_OPT,d0
  716.     cmp.b    d0,d2
  717.     beq    dispopc9        ;最適化前のサイズと同じなので何もしない
  718.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  719.     addq.l    #2,a4            ;-2(.l→.wのみ)
  720.     move.b    d0,d2            ;(後で伸びる場合がある)
  721.     move.w    d2,d0
  722.     move.l    d3,d1
  723.     bsr    fmodify
  724.     move.w    (OPTDSPCODE,a6),d0    ;(bd,An)→(d,An)の変更を行う
  725.     move.l    (OPTDSPPOS,a6),d1
  726.     and.w    #.not.$003F,d0
  727.     or.w    #EAC_DSPPC,d0
  728.     bra    fmodify
  729.  
  730. ;----------------------------------------------------------------
  731. indexadr:                ;06xx (d,An,Rn)
  732.     bsr    tmpreadd0w        ;拡張ワードは読み飛ばす(pass 3で変更する)
  733.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  734.     bsr    tmpreadd0w
  735.     move.w    d0,d2
  736.     tst.b    d0
  737.     bmi    indexadr5        ;最適化対象コードの場合
  738. indexadr0:
  739.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  740. indexadr1:
  741.     ext.w    d2
  742.     move.b    (indexadr_tbl,pc,d2.w),d2
  743.     adda.w    d2,a5
  744. indexadr9:
  745.     rts
  746.  
  747. indexadr_tbl:    .dc.b    -1,4,6,2
  748.  
  749. indexadr8:                ;最適化できない場合
  750.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  751.     move.w    d2,d0
  752.     move.l    d3,d1
  753.     bsr    fmodify
  754.     bra    indexadr1
  755.  
  756. indexadr5:                ;最適化対象コード
  757.     bsr    calctmpexpr        ;後続の式の値を計算する
  758.     tst.b    d0
  759.     beq    indexadr6
  760.     cmp.b    #SECT_RDATA,d0
  761.     bcc    indexadr8        ;定数でない場合は最適化できない
  762.     bra    indexadr5_l
  763.  
  764. indexadr6:                ;定数の場合
  765.     move.b    d1,d0
  766.     ext.w    d0
  767.     ext.l    d0
  768.     cmp.l    d0,d1
  769.     beq    indexadr5_s
  770.     move.w    d1,d0
  771.     ext.l    d0
  772.     cmp.l    d0,d1
  773.     beq    indexadr5_w
  774. indexadr5_l:
  775.     addq.l    #6,a5
  776.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  777.     beq    indexadr9        ;最適化前のサイズと同じなので何もしない
  778.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  779.     subq.l    #2,a4            ;.w→.l
  780.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  781.     beq    indexdar5_l1
  782.     subq.l    #2,a4            ;.s→.l
  783. indexdar5_l1:
  784.     move.w    d2,d0
  785.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  786.     move.l    d3,d1
  787.     bra    fmodify
  788.  
  789. indexadr5_w:
  790.     addq.l    #4,a5
  791.     move.w    d2,d0
  792.     move.l    d3,d1
  793.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  794.     beq    indexadr9        ;最適化前のサイズと同じなので何もしない
  795.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  796.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  797.     beq    indexadr5_w1
  798.     subq.l    #2,a4            ;.s→.wの場合
  799.     move.b    #SZ_WORD,d0        ;(サイズが伸びてしまった場合はこれ以上最適化しない)
  800.     tst.b    (OPTMOREFLG,a6)
  801.     bpl    fmodify
  802.     move.b    #SZ_WORD|ESZ_OPT,d0    ;最初の1回ならさらに最適化できる
  803.     bra    fmodify
  804.  
  805. indexadr5_w1:
  806.     addq.l    #2,a4            ;.l→.wの場合
  807.     move.b    #SZ_WORD|ESZ_OPT,d0    ;(後で伸びる場合がある)
  808.     bra    fmodify
  809.  
  810. indexadr5_s:
  811.     addq.l    #2,a5
  812.     cmp.b    #SZ_SHORT|ESZ_OPT,d2
  813.     beq    indexadr9        ;最適化前のサイズと同じなので何もしない
  814.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  815.     move.b    d2,d0
  816.     bsr    getdtsize
  817.     add.l    d0,a4
  818.     move.w    d2,d0
  819.     move.b    #SZ_SHORT|ESZ_OPT,d0    ;(後で伸びる場合がある)
  820.     move.l    d3,d1
  821.     bra    fmodify
  822.  
  823. ;----------------------------------------------------------------
  824. indexpc:                ;07xx (d,PC,Rn)
  825.     bsr    tmpreadd0w        ;拡張ワードは読み飛ばす(pass 3で変更する)
  826.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  827.     bsr    tmpreadd0w
  828.     move.w    d0,d2
  829.     tst.b    d0
  830.     bpl    indexadr0
  831.     bsr    calctmpexpr        ;後続の式の値を計算する
  832.     tst.b    d0
  833.     bmi    indexadr8        ;定数でない場合は最適化できない
  834.     beq    indexadr6        ;定数の場合
  835.     cmp.b    (SECTION,a6),d0        ;アドレス値の場合
  836.     bne    indexadr8        ;セクションが違うので最適化できない
  837.     sub.l    a5,d1            ;現在のアドレスからの相対値
  838.     move.b    d1,d0
  839.     ext.w    d0
  840.     ext.l    d0
  841.     cmp.l    d0,d1
  842.     beq    indexadr5_s
  843.     move.b    d2,d4
  844.     and.b    #3,d4
  845.     ext.w    d4
  846.     moveq.l    #0,d0
  847.     move.b    (indexpc_tbl1,pc,d4.w),d0
  848.     cmp.l    d0,d1
  849.     bcs    indexadr5_s        ;$82未満なら.w→.s / $84未満なら.l→.s
  850.     cmp.l    #-$8000,d1
  851.     blt    indexadr5_l
  852.     add.w    d4,d4
  853.     move.w    (indexpc_tbl2,pc,d4.w),d0
  854.     cmp.l    d0,d1
  855.     blt    indexadr5_w        ;$7FFE未満なら.s→.w / $8002未満なら.l→.w
  856.     bra    indexadr5_l
  857.  
  858. indexpc_tbl1:    .dc.b    -1,$82,$84,$80
  859. indexpc_tbl2:    .dc.w    -1,$8002,$8000,$7FFE
  860.  
  861. ;----------------------------------------------------------------
  862. odisp:                    ;0Bxx アウタディスプレースメント
  863.     moveq.l    #$0003,d5
  864.     bra    bdodadr
  865.  
  866. ;----------------------------------------------------------------
  867. bdadr:                    ;09xx アドレスレジスタ間接ベースディスプレースメント
  868.     moveq.l    #$0030,d5
  869. bdodadr:
  870.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  871.     bsr    tmpreadd0w
  872.     move.w    d0,d2
  873.     tst.b    d0
  874.     bmi    bdodadr5        ;最適化対象コードの場合
  875.     beq    skipexpr1        ;(ディスプレースメントはサプレスされている)
  876.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  877. bdodadr1:
  878.     cmpi.b    #SZ_WORD,d2
  879.     bne    bdodadr2
  880.     addq.l    #2,a5            ;ディスプレースメントサイズが.wの場合
  881.     rts
  882.  
  883. bdodadr2:
  884.     addq.l    #4,a5            ;                 .lの場合
  885. bdodadr9:
  886.     rts
  887.  
  888. bdodadr8:                ;最適化できない場合
  889.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  890.     move.w    d2,d0
  891.     move.l    d3,d1
  892.     bsr    fmodify
  893.     bra    bdodadr1
  894.  
  895. bdodadr5:                ;最適化対象コード
  896.     bsr    calctmpexpr        ;後続の式の値を計算する
  897.     tst.b    d0
  898.     beq    bdodadr6
  899.     cmp.b    #SECT_RDATA,d0
  900.     bcc    bdodadr8        ;定数でない場合は最適化できない
  901.     bra    bdodadr5_l
  902.  
  903. bdodadr6:                ;定数の場合
  904.     move.l    d1,d0            ;(tst.l d1 & move.w d1,d0)
  905.     beq    bdodadr5_nul
  906.     ext.l    d0
  907.     cmp.l    d0,d1
  908.     beq    bdodadr5_w
  909. bdodadr5_l:
  910.     addq.l    #4,a5
  911.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  912.     beq    bdodadr9        ;最適化前のサイズと同じなので何もしない
  913.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  914.     subq.l    #2,a4            ;(.w→.lのみ)
  915.     move.w    d2,d0
  916.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  917.     move.l    d3,d1
  918.     bsr    fmodify
  919.     move.w    (OPTEXTCODE,a6),d0    ;拡張ワードの変更を行う
  920.     move.l    (OPTEXTPOS,a6),d1
  921.     move.w    #EXW_BDL|EXW_ODL,d2
  922.     and.w    d5,d2
  923.     not.w    d5
  924.     and.w    d5,d0
  925.     or.w    d2,d0
  926.     move.w    d0,(OPTEXTCODE,a6)
  927.     bra    fmodify
  928.  
  929. bdodadr5_w:
  930.     addq.l    #2,a5
  931.     moveq.l    #SZ_WORD|ESZ_OPT,d0
  932.     cmp.b    d0,d2
  933.     beq    bdodadr9        ;最適化前のサイズと同じなので何もしない
  934.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  935.     addq.l    #2,a4            ;(.l→.wのみ)
  936.     move.b    d0,d2            ;(後で伸びる場合がある)
  937.     move.w    d2,d0
  938.     move.l    d3,d1
  939.     bsr    fmodify
  940.     move.w    (OPTEXTCODE,a6),d0    ;拡張ワードの変更を行う
  941.     move.l    (OPTEXTPOS,a6),d1
  942.     move.w    #EXW_BDW|EXW_ODW,d2
  943.     and.w    d5,d2
  944.     not.w    d5
  945.     and.w    d5,d0
  946.     or.w    d2,d0
  947.     move.w    d0,(OPTEXTCODE,a6)
  948.     bra    fmodify
  949.  
  950. bdodadr5_nul:
  951.     tst.b    (NONULDISP,a6)
  952.     bne    bdodadr5_w
  953.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  954.     move.b    d2,d0
  955.     bsr    getdtsize
  956.     add.l    d0,a4
  957.     move.w    d2,d0
  958.     clr.b    d0            ;ディスプレースメントサプレス確定
  959.     move.l    d3,d1
  960.     bsr    fmodify
  961.     move.w    (OPTEXTCODE,a6),d0    ;拡張ワードの変更を行う
  962.     move.l    (OPTEXTPOS,a6),d1
  963.     move.w    #EXW_BDNUL|EXW_ODNUL,d2
  964.     and.w    d5,d2
  965.     not.w    d5
  966.     and.w    d5,d0
  967.     or.w    d2,d0
  968.     move.w    d0,(OPTEXTCODE,a6)
  969.     bra    fmodify
  970.  
  971. ;----------------------------------------------------------------
  972. bdpc:                    ;0Axx PC間接ベースディスプレースメント
  973.     moveq.l    #$0030,d5
  974.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  975.     bsr    tmpreadd0w
  976.     move.w    d0,d2
  977.     tst.b    d0
  978.     bmi    bdpc5            ;最適化対象コードの場合
  979.     beq    skipexpr1        ;(ベースディスプレースメントはサプレスされている)
  980.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  981.     bra    bdodadr1
  982.  
  983. bdpc5:                    ;最適化対象コード
  984.     bsr    calctmpexpr        ;後続の式の値を計算する
  985.     tst.b    d0
  986.     bmi    bdodadr8        ;定数でない場合は最適化できない
  987.     beq    bdodadr6        ;定数の場合
  988.     cmp.b    (SECTION,a6),d0        ;アドレス値の場合
  989.     bne    bdodadr8        ;セクションが違うので最適化できない
  990.     sub.l    a5,d1            ;現在のアドレスからの相対値
  991.     addq.l    #2,d1
  992.     move.w    d1,d0
  993.     ext.l    d0
  994.     cmp.l    d0,d1
  995.     beq    bdodadr5_w
  996.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  997.     beq    bdodadr5_l        ;$8000以上なら.w→.l
  998.     cmp.l    #$8002,d1
  999.     bcs    bdodadr5_w        ;$8002未満なら.l→.w
  1000.     addq.l    #4,a5
  1001.     rts
  1002.  
  1003. ;----------------------------------------------------------------
  1004. linkcmd:                ;33xx link.w/.l
  1005.     addq.l    #2,a5
  1006.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  1007.     bsr    tmpreadd0w
  1008.     move.w    d0,d2
  1009.     tst.b    d0
  1010.     bmi    linkcmd5        ;最適化対象コードの場合
  1011.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  1012. linkcmd1:
  1013.     cmpi.b    #SZ_WORD,d2
  1014.     beq    linkcmd2
  1015.     addq.l    #2,a5            ;ディスプレースメントサイズが.lの場合
  1016. linkcmd2:
  1017.     addq.l    #2,a5            ;                 .wの場合
  1018. linkcmd9:
  1019.     rts
  1020.  
  1021. linkcmd8:                ;最適化できない場合
  1022.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  1023.     move.w    d2,d0
  1024.     move.l    d3,d1
  1025.     bsr    fmodify
  1026.     bra    linkcmd1
  1027.  
  1028. linkcmd5:                ;最適化対象コード
  1029.     bsr    calctmpexpr        ;後続の式の値を計算する
  1030.     tst.b    d0
  1031.     beq    linkcmd6
  1032.     cmp.b    #SECT_RDATA,d0
  1033.     bcc    linkcmd8        ;定数でない場合は最適化できない
  1034.     bra    linkcmd5_l
  1035.  
  1036. linkcmd6:
  1037.     move.l    d1,d0
  1038.     ext.l    d0
  1039.     cmp.l    d0,d1
  1040.     beq    linkcmd5_w
  1041. linkcmd5_l:
  1042.     addq.l    #4,a5
  1043.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  1044.     beq    linkcmd9        ;最適化前のサイズと同じなので何もしない
  1045.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1046.     subq.l    #2,a4            ;(.w→.lのみ)
  1047.     move.w    d2,d0
  1048.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  1049.     move.l    d3,d1
  1050.     bra    fmodify
  1051.  
  1052. linkcmd5_w:
  1053.     addq.l    #2,a5
  1054.     moveq.l    #SZ_WORD|ESZ_OPT,d0
  1055.     cmp.b    d0,d2
  1056.     beq    linkcmd9        ;最適化前のサイズと同じなので何もしない
  1057.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1058.     addq.l    #2,a4            ;(.l→.wのみ)
  1059.     move.b    d0,d2            ;(後で伸びる場合がある)
  1060.     move.w    d2,d0
  1061.     move.l    d3,d1
  1062.     bra    fmodify
  1063.  
  1064. ;----------------------------------------------------------------
  1065. bracmd:                    ;0Cxx bra/bsr/b<cc>.s/.w/.l
  1066.     bsr    tmpreadd0w        ;命令コード
  1067. bracmd0:
  1068.     move.w    d0,d5
  1069.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  1070.     bsr    tmpreadd0w
  1071.     move.w    d0,d2
  1072.     tst.b    d0
  1073.     bmi    bracmd5            ;最適化対象コードの場合
  1074.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  1075.     and.b    #3,d2            ;$40を消す
  1076. bracmd1:
  1077.     ext.w    d2
  1078.     move.b    (bracmd_tbl,pc,d2.w),d2
  1079.     adda.w    d2,a5
  1080.     rts
  1081.  
  1082. bracmd_tbl:    .dc.b    0,4,6,2
  1083.  
  1084. bracmd8:                ;最適化できない場合
  1085.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  1086.     move.w    d2,d0
  1087.     move.l    d3,d1
  1088.     bsr    fmodify
  1089.     bra    bracmd1
  1090.  
  1091. bracmd5:                ;最適化対象コード
  1092.     bsr    calctmpexpr        ;後続の式の値を計算する
  1093.     tst.b    d0
  1094.     ble    bracmd8            ;値がアドレス値でないので最適化できない
  1095.     cmp.b    (SECTION,a6),d0        ;アドレス値の場合
  1096.     bne    bracmd8            ;セクションが違うので最適化できない
  1097.     sub.l    a5,d1            ;現在のアドレスからの相対値
  1098.     subq.l    #2,d1            ;(命令コードの分)
  1099.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  1100.     beq    bracmd5_w
  1101. bracmd6:
  1102.     cmp.b    #SZ_SHORT|ESZ_OPT,d2
  1103.     beq    bracmd5_s
  1104.     cmp.b    #ESZ_OPT,d2
  1105.     beq    bracmd5_nul
  1106.  
  1107. bracmd5_l:                ;.l→…
  1108.     moveq.l    #4,d0
  1109.     cmp.l    d0,d1
  1110.     beq    bracmd7_nul        ;次の命令へのブランチの場合
  1111.     move.b    #SZ_SHORT|ESZ_OPT,d2
  1112.     moveq.l    #4,d4
  1113.     move.w    d1,d0
  1114.     ext.w    d0
  1115.     ext.l    d0
  1116.     cmp.l    d0,d1
  1117.     beq    bracmd7_s
  1118.     cmp.l    #$84,d1
  1119.     bcs    bracmd7_s        ;$84未満なら.l→.s
  1120.     move.b    #SZ_WORD|ESZ_OPT,d2
  1121.     moveq.l    #2,d4
  1122.     move.w    d1,d0
  1123.     ext.l    d0
  1124.     cmp.l    d0,d1
  1125.     beq    bracmd7_w
  1126.     cmp.l    #$8002,d1
  1127.     bcs    bracmd7_w        ;$8002未満なら.l→.w
  1128.     addq.l    #6,a5            ;サイズが変化しない
  1129.     rts
  1130.  
  1131. bracmd5_w:                ;.w→…
  1132.     moveq.l    #2,d0
  1133.     cmp.l    d0,d1
  1134.     beq    bracmd7_nul        ;次の命令へのブランチの場合
  1135.     move.b    #SZ_SHORT|ESZ_OPT,d2
  1136.     moveq.l    #2,d4
  1137.     move.w    d1,d0
  1138.     ext.w    d0
  1139.     ext.l    d0
  1140.     cmp.l    d0,d1
  1141.     beq    bracmd7_s
  1142.     cmp.l    #$82,d1
  1143.     bcs    bracmd7_s        ;$82未満なら.w→.s
  1144.  
  1145.     move.w    d1,d0
  1146.     ext.l    d0
  1147.     cmp.l    d0,d1
  1148.     bne    bracmd7_l        ;.w→.l
  1149.     addq.l    #4,a5            ;サイズが変化しない
  1150.     rts
  1151.  
  1152. bracmd5_s:                ;.s→…
  1153.     tst.l    d1
  1154.     beq    bracmd7_nul        ;次の命令へのブランチの場合
  1155.     move.b    #SZ_WORD,d2
  1156.     moveq.l    #-2,d4
  1157.     move.b    d1,d0
  1158.     ext.w    d0
  1159.     cmp.w    d0,d1
  1160.     bne    bracmd7_w        ;.s→.w(.s→.lはありえない)
  1161.     addq.l    #2,a5            ;サイズが変化しない
  1162. bracmd9:
  1163.     rts
  1164.  
  1165. bracmd5_nul:                ;0→…
  1166.     moveq.l    #-2,d0
  1167.     cmp.l    d0,d1
  1168.     beq    bracmd9            ;サイズが変化しない
  1169.     tst.l    d1
  1170.     beq    bracmd7_w0        ;次の命令へのブランチ
  1171.     move.b    #SZ_SHORT,d2        ;サイズが伸びたらそこで確定する
  1172.     moveq.l    #-2,d4            ;(0→.l/0→.wはありえない)
  1173. bracmd7_s:                ;→.s
  1174.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1175.     addq.l    #2,a5
  1176.     add.l    d4,a4
  1177.     move.w    d2,d0
  1178.     move.l    d3,d1
  1179.     bra    fmodify
  1180.  
  1181. bracmd7_w0:                ;次の命令へのブランチの場合(0→.w)
  1182.     moveq.l    #-2,d1
  1183. bracmd7_w1:                ;次の命令へのブランチをサプレスしない場合
  1184.     move.l    d1,d4
  1185.     subq.l    #2,d4            ;.s:-2/.w:0/.l:2bytes縮小
  1186.     move.b    #SZ_WORD,d2
  1187. bracmd7_w:                ;→.w
  1188.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1189.     addq.l    #4,a5
  1190.     add.l    d4,a4
  1191.     move.w    d2,d0
  1192.     move.l    d3,d1
  1193.     bra    fmodify
  1194.  
  1195. bracmd7_l:                ;.w→.l
  1196.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1197.     addq.l    #6,a5
  1198.     subq.l    #2,a4
  1199.     move.w    d2,d0
  1200.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  1201.     move.l    d3,d1
  1202.     bra    fmodify
  1203.  
  1204. ;直後へのbra/bcc/bsr
  1205. bracmd7_nul:
  1206.     addq.l    #2,d1
  1207. ;d1.l:元のサイズ(.s=2,.w=4,bra.l=6,jbra.l=8)
  1208.     cmp.w    #$6100,d5
  1209.     beq    bracmd7_nul_bsr
  1210.     tst.b    (NOBRACUT,a6)
  1211.     bne    bracmd7_nul_bcc
  1212. ;直後へのbcc/braを削除するとき
  1213.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1214.     adda.l    d1,a4            ;→nul
  1215.                     ;命令がなくなるのでa5(ロケーションカウンタ)は増やさない
  1216.     move.w    d2,d0
  1217.     move.b    #ESZ_OPT,d0        ;次回も必ず最適化対象とする
  1218.     move.l    d3,d1
  1219.     bra    fmodify
  1220.  
  1221. ;直後へのbsrなので.wにしてpeaに変換するとき
  1222. bracmd7_nul_bsr:
  1223.     move.b    #SZ_WORD|$40,d2        ;$40は直後へのbsr
  1224.     bra    bracmd7_nul_b
  1225.  
  1226. ;直後へのbra/bccでNOBRACUT=trueなので.wで出力するとき
  1227. bracmd7_nul_bcc:
  1228.     move.b    #SZ_WORD,d2        ;bsrではないので$40をセットしないこと
  1229.                     ;(objgenが$40を直後へのbsrと判断する)
  1230. bracmd7_nul_b:
  1231.     subq.l    #4,d1            ;.s=-2,.w=0,bra.l=2,jbra.l=4
  1232.     beq    bracmd7_nul_b_w
  1233.     st.b    (OPTFLAG,a6)        ;.w→.wのときはサイズが変化しない
  1234. bracmd7_nul_b_w:
  1235.     adda.l    d1,a4            ;→.w
  1236.     addq.l    #4,a5            ;.w固定
  1237.     move.w    d2,d0
  1238.     move.l    d3,d1
  1239.     bra    fmodify
  1240.  
  1241. ;----------------------------------------------------------------
  1242. jbracmd:                ;31xx jbra/jbsr/jb<cc>
  1243.     bsr    tmpreadd0w        ;命令コード
  1244.     cmp.w    #$6100,d0
  1245.     bls    bracmd0            ;jbra/jbsrはbra/bsrと同じ
  1246.     move.w    d0,d5
  1247.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  1248.     bsr    tmpreadd0w
  1249.     move.w    d0,d2
  1250.     tst.b    d0
  1251.     bmi    jbracmd5        ;最適化対象コードの場合
  1252.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  1253. jbracmd1:
  1254.     ext.w    d2
  1255.     move.b    (jbracmd_tbl,pc,d2.w),d2
  1256.     adda.w    d2,a5
  1257.     rts
  1258.  
  1259. jbracmd_tbl:    .dc.b    0,4,8,2
  1260.  
  1261. jbracmd8:                ;最適化できない場合
  1262.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  1263.     move.w    d2,d0
  1264.     move.l    d3,d1
  1265.     bsr    fmodify
  1266.     bra    jbracmd1
  1267.  
  1268. jbracmd5:                ;最適化対象コード
  1269.     bsr    calctmpexpr        ;後続の式の値を計算する
  1270.     tst.b    d0
  1271.     ble    jbracmd8        ;値がアドレス値でないので最適化できない
  1272.     cmp.b    (SECTION,a6),d0        ;アドレス値の場合
  1273.     bne    jbracmd8        ;セクションが違うので最適化できない
  1274.     sub.l    a5,d1            ;現在のアドレスからの相対値
  1275.     subq.l    #2,d1            ;(命令コードの分)
  1276.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  1277.     beq    jbracmd5_w
  1278.     cmp.b    #SZ_LONG|ESZ_OPT,d2
  1279.     bne    bracmd6            ;.w/.l以外はb<cc>と同じ
  1280.  
  1281. jbracmd5_l:                ;.l→…
  1282.     moveq.l    #6,d0            ;+2
  1283.     cmp.l    d0,d1
  1284.     beq    bracmd7_nul        ;次の命令へのブランチの場合
  1285.     move.b    #SZ_SHORT|ESZ_OPT,d2
  1286.     moveq.l    #6,d4            ;+2
  1287.     move.w    d1,d0
  1288.     ext.w    d0
  1289.     ext.l    d0
  1290.     cmp.l    d0,d1
  1291.     beq    bracmd7_s
  1292.     cmp.l    #$86,d1
  1293.     bcs    bracmd7_s        ;+2 $86未満なら.l→.s
  1294.     move.b    #SZ_WORD|ESZ_OPT,d2
  1295.     moveq.l    #4,d4            ;+2
  1296.     move.w    d1,d0
  1297.     ext.l    d0
  1298.     cmp.l    d0,d1
  1299.     beq    bracmd7_w
  1300.     cmp.l    #$8004,d1
  1301.     bcs    bracmd7_w        ;+2 $8004未満なら.l→.w
  1302.     addq.l    #8,a5            ;+2 サイズが変化しない
  1303.     rts
  1304.  
  1305. jbracmd5_w:                ;.w→…
  1306.     moveq.l    #2,d0
  1307.     cmp.l    d0,d1
  1308.     beq    bracmd7_nul        ;次の命令へのブランチの場合
  1309.     move.b    #SZ_SHORT|ESZ_OPT,d2
  1310.     moveq.l    #2,d4
  1311.     move.w    d1,d0
  1312.     ext.w    d0
  1313.     ext.l    d0
  1314.     cmp.l    d0,d1
  1315.     beq    bracmd7_s
  1316.     cmp.l    #$82,d1
  1317.     bcs    bracmd7_s        ;$82未満なら.w→.s
  1318.  
  1319.     move.w    d1,d0
  1320.     ext.l    d0
  1321.     cmp.l    d0,d1
  1322.     bne    jbracmd7_l        ;.w→.l
  1323.     addq.l    #4,a5            ;サイズが変化しない
  1324.     rts
  1325.  
  1326. jbracmd7_l:                ;.w→.l
  1327.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1328.     addq.l    #8,a5            ;+2
  1329.     subq.l    #2,a4
  1330.     move.w    d2,d0
  1331.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  1332.     move.l    d3,d1
  1333.     bra    fmodify
  1334.  
  1335. ;----------------------------------------------------------------
  1336. cpbracmd:                ;0Dxx cpb<cc>.w/.l
  1337.     bsr    tmpreadd0w        ;命令コードは読み飛ばす(pass 3で変更する)
  1338.     GETFPTR    TEMPFILPTR,d3        ;現在のファイルポインタ位置を得る
  1339.     bsr    tmpreadd0w
  1340.     move.w    d0,d2
  1341.     tst.b    d0
  1342.     bmi    cpbracmd5        ;最適化対象コードの場合
  1343.     bsr    skipexpr1        ;最適化対象でないので後続の式を読み飛ばす
  1344. cpbracmd1:                ;(命令サプレスで確定することはない)
  1345.     cmpi.b    #SZ_WORD,d2
  1346.     bne    cpbracmd2
  1347.     addq.l    #4,a5            ;ディスプレースメントサイズが.wの場合
  1348.     rts
  1349.  
  1350. cpbracmd2:
  1351.     addq.l    #6,a5            ;                 .lの場合
  1352.     rts
  1353.  
  1354. cpbracmd8:                ;最適化できない場合
  1355.     and.b    #3,d2            ;(ESZ_OPTビットをクリア)
  1356.     move.w    d2,d0
  1357.     move.l    d3,d1
  1358.     bsr    fmodify
  1359.     bra    cpbracmd1
  1360.  
  1361. cpbracmd5:                ;最適化対象コード
  1362.     bsr    calctmpexpr        ;後続の式の値を計算する
  1363.     tst.b    d0
  1364.     ble    cpbracmd8        ;値がアドレス値でないので最適化できない
  1365.     cmp.b    (SECTION,a6),d0        ;アドレス値の場合
  1366.     bne    cpbracmd8        ;セクションが違うので最適化できない
  1367.     sub.l    a5,d1            ;現在のアドレスからの相対値
  1368.     subq.l    #2,d1            ;(命令コードの分)
  1369.     cmp.b    #SZ_WORD|ESZ_OPT,d2
  1370.     beq    cpbracmd5_w
  1371.     cmp.b    #ESZ_OPT,d2
  1372.     beq    cpbracmd5_nul
  1373. cpbracmd5_l:                ;.l→…
  1374.     moveq.l    #4,d0
  1375.     cmp.l    d0,d1
  1376.     beq    cpbracmd7_nul        ;次の命令へのブランチ
  1377.     move.b    #SZ_WORD|ESZ_OPT,d2
  1378.     moveq.l    #2,d4            ;縮む場合に後退するバイト数
  1379.     move.w    d1,d0
  1380.     ext.l    d0
  1381.     cmp.l    d0,d1
  1382.     beq    cpbracmd7_w
  1383.     cmp.l    #$8002,d1
  1384.     bcs    cpbracmd7_w        ;$8002未満なら.l→.w
  1385.     addq.l    #6,a5            ;サイズが変化しない
  1386.     rts
  1387.  
  1388. cpbracmd5_w:                ;.w→…
  1389.     moveq.l    #2,d0
  1390.     cmp.l    d0,d1
  1391.     beq    cpbracmd7_nul        ;次の命令へのブランチ
  1392.     move.w    d1,d0
  1393.     ext.l    d0
  1394.     cmp.l    d0,d1
  1395.     bne    cpbracmd7_l
  1396.     addq.l    #4,a5            ;サイズが変化しない
  1397. cpbracmd9:
  1398.     rts
  1399.  
  1400. cpbracmd5_nul:                ;0→…
  1401.     moveq.l    #-2,d0
  1402.     cmp.l    d0,d1
  1403.     beq    cpbracmd9        ;サイズが変化しない
  1404.     move.b    #SZ_WORD,d2        ;サイズが伸びたらそこで確定する
  1405.     moveq.l    #-4,d4            ;(0→.lはありえない)
  1406. cpbracmd7_w:                ;→.w
  1407.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1408.     addq.l    #4,a5
  1409.     add.l    d4,a4
  1410.     move.w    d2,d0
  1411.     move.l    d3,d1
  1412.     bra    fmodify
  1413.  
  1414. cpbracmd7_l:                ;.w→.l
  1415.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1416.     addq.l    #6,a5
  1417.     subq.l    #2,a4
  1418.     move.w    d2,d0
  1419.     move.b    (OPTMOREFLG,a6),d0    ;(最初のみESZ_OPT)
  1420.     move.l    d3,d1
  1421.     bra    fmodify
  1422.  
  1423. cpbracmd7_nul:                ;→0(ブランチ命令がサプレスされる場合)
  1424.     tst.b    (NOBRACUT,a6)
  1425.     beq    cpbracmd7_nul1
  1426.     move.l    d1,d4
  1427.     subq.l    #2,d4
  1428.     move.b    #SZ_WORD,d2
  1429.     bra    cpbracmd7_w
  1430.  
  1431. cpbracmd7_nul1:
  1432.     st.b    (OPTFLAG,a6)        ;最適化が行われた
  1433.     addq.l    #2,d1
  1434.     add.l    d1,a4
  1435.     move.w    d2,d0
  1436.     move.b    #ESZ_OPT,d0        ;次回も必ず最適化対象とする
  1437.     move.l    d3,d1
  1438.     bra    fmodify
  1439.  
  1440.  
  1441. ;----------------------------------------------------------------
  1442. ;    サブルーチン
  1443. ;----------------------------------------------------------------
  1444.  
  1445. ;----------------------------------------------------------------
  1446. ;    テンポラリファイルからシンボル番号・式を読み込み、その値を得る
  1447. ;    in :d0.w=シンボル値/式を表わすテンポラリファイルコード
  1448. ;    out:d0.w=結果の属性(0:定数/1~4:アドレス値(セクション番号)/
  1449. ;                $FFFF:未定/$01FF:オフセット付き外部参照/$02FF:外部参照値)
  1450. ;        d1.l=結果の値
  1451. calctmpexpr:
  1452.     move.l    a1,-(sp)
  1453.     and.w    #$FF00,d0
  1454.     cmp.w    #T_SYMBOL,d0
  1455.     bne    calctmpexpr5
  1456.  
  1457.     bsr    tmpreadd0l        ;シンボル値が続く場合
  1458.     movea.l    d0,a1
  1459.     cmpi.b    #ST_LOCAL,(SYM_TYPE,a1)    ;(ST_VALUE or ST_LOCAL)
  1460.     bhi    calctmpexpr9        ;数値シンボルでない
  1461.     cmpi.b    #SA_DEFINE,(SYM_ATTRIB,a1)
  1462.     blo    calctmpexpr9        ;未定義シンボル
  1463.  
  1464.     clr.w    d0
  1465.     move.b    (SYM_SECTION,a1),d0
  1466.     beq    calctmpexpr2
  1467.     cmp.b    (SECTION,a6),d0
  1468.     bne    calctmpexpr2
  1469.     move.b    (SYM_ORGNUM,a1),d1
  1470.     cmp.b    (ORGNUM,a6),d1
  1471.     bne    calctmpexpr2
  1472.     move.b    (SYM_OPTCOUNT,a1),d1
  1473.     cmp.b    (OPTCOUNT,a6),d1
  1474.     beq    calctmpexpr2
  1475.     move.l    (SYM_VALUE,a1),d1
  1476.     sub.l    a4,d1
  1477.     movea.l    (sp)+,a1
  1478.     rts
  1479.  
  1480. calctmpexpr2:
  1481.     move.l    (SYM_VALUE,a1),d1
  1482.     movea.l    (sp)+,a1
  1483.     rts
  1484.  
  1485. calctmpexpr5:
  1486.     move.l    a5,(LOCATION,a6)
  1487.     move.l    a4,(LOCOFFSET,a6)
  1488.     bsr    tmpreadd0w        ;式が続く場合
  1489.     move.w    d0,d1            ;逆ポーランド式の長さ
  1490.     lea.l    (OPRBUF,a6),a1
  1491. calctmpexpr6:
  1492.     bsr    tmpreadd0w        ;式本体を読み込む
  1493.     move.w    d0,(a1)+
  1494.     dbra    d1,calctmpexpr6
  1495.     clr.w    (a1)+            ;(エンドコード)
  1496.     lea.l    (OPRBUF,a6),a1
  1497.     bsr    calcrpn            ;読み込んだ式を計算する
  1498.     movea.l    (sp)+,a1
  1499.     rts
  1500.  
  1501. calctmpexpr9:
  1502.     moveq.l    #-1,d0            ;値が未定
  1503.     movea.l    (sp)+,a1
  1504.     rts
  1505.  
  1506.  
  1507. ;----------------------------------------------------------------
  1508.     .end
  1509.  
  1510. ;----------------------------------------------------------------
  1511. ;    $Log: optimize.s,v $
  1512. ;    Revision 2.5  1999  3/ 2(Tue) 17:04:08 M.Kamada
  1513. ;    +82 エラーメッセージを日本語化
  1514. ;    +82 T_ERRORを$FF00から通常のコードに変更
  1515. ;
  1516. ;    Revision 2.4  1999  2/27(Sat) 23:44:02 M.Kamada
  1517. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  1518. ;
  1519. ;    Revision 2.3  1999  2/24(Wed) 22:03:04 M.Kamada
  1520. ;    +80 ColdFire対応
  1521. ;    +80 .offsym <初期値>,<シンボル>
  1522. ;
  1523. ;    Revision 2.2  1998 10/10(Sat) 01:53:40 M.Kamada
  1524. ;    +77 -pのとき.INSERTで1度に256バイト以上読み出すと誤動作する
  1525. ;
  1526. ;    Revision 2.1  1997 10/13(Mon) 15:36:35 M.Kamada
  1527. ;    +51 直後へのbsr→pea
  1528. ;    +52 jmp/jsrを最適化する
  1529. ;
  1530. ;    Revision 2.0  1997 10/12(Sun) 18:50:14 M.Kamada
  1531. ;    +50 fadd.d (sp),fp0;bra @f;nop;@@:のbraが最適化されないバグを修正
  1532. ;    +51 bra @f;.rept 30;fadd.x fp0,fp0;.endm;@@:のbraが最適化されないバグを修正
  1533. ;
  1534. ;    Revision 1.9  1997  9/14(Sun) 16:30:23 M.Kamada
  1535. ;    +46 error.sを分離
  1536. ;
  1537. ;    Revision 1.8  1997  6/25(Wed) 13:37:15 M.Kamada
  1538. ;    +33 プレデファインシンボルCPUに対応する
  1539. ;    +34 プレデファインシンボルに対応
  1540. ;
  1541. ;    Revision 1.7  1997  2/ 1(Sat) 23:31:32 M.Kamada
  1542. ;    +13 bdpcの最適化処理のバグを修正
  1543. ;
  1544. ;    Revision 1.6  1996 12/15(Sun) 01:30:51 M.Kamada
  1545. ;    +07 F43G対策
  1546. ;        削除すべきNOPの処理を追加した
  1547. ;
  1548. ;    Revision 1.5  1994/07/12  14:58:40  nakamura
  1549. ;    link命令に対する最適化処理を追加した
  1550. ;
  1551. ;    Revision 1.4  1994/03/06  11:31:16  nakamura
  1552. ;    jbra,jbsr,jbccおよびopcに対する最適化処理の追加
  1553. ;
  1554. ;    Revision 1.3  1994/02/24  12:13:12  nakamura
  1555. ;    32KB以上後方へのブランチの最適化に失敗するのを修正した。
  1556. ;
  1557. ;    Revision 1.2  1994/02/20  13:52:18  nakamura
  1558. ;    次の命令へのbsrの最適化に失敗するバグを修正。
  1559. ;
  1560. ;    Revision 1.1  1994/02/16  15:33:32  nakamura
  1561. ;    Initial revision
  1562. ;
  1563. ;
  1564.